home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Camelot / Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].zip / Camelot 134 (1991-10)(Swedish User Group of Amiga)(SE)(PD)[WB].adf / RxSlides / setbits.a < prev   
Text File  |  1990-03-08  |  1KB  |  57 lines

  1. ;------------------------------------------------------------------------
  2. ;  setbits() -- set random bits in a plane
  3. ;  part of the "dissolve" program from amicus
  4. ;-------------------------------------------------------------------------
  5. ;
  6. ; setbits( plane, maxbit, numbits )
  7. ; UBYTE   *plane;
  8. ; unsigned long maxbit;
  9. ; unsigned int numbits;
  10.  
  11.     CSECT    text
  12.  
  13.     XDEF    _setbits
  14.  
  15.     XREF    _rand_mask,_rand_val
  16.  
  17.     ;register useage: d5 - max bit # to set, d4 - random generator mask
  18.     ; d3 - current random value, d2 - byte offset in array for bit
  19.     ; d2 - bit # to set, d1 - loop counter
  20.  
  21. _setbits    equ    *
  22.  
  23.     movem.l    d2-d5,-(a7)
  24.     move.l    20(a7),a0    ;get base address of array
  25.     move.l    24(a7),d5    ;get maxbit number
  26.     move.l    28(a7),d1    ;get # of bits to set
  27.     move.l    _rand_mask,d4
  28.     move.l    _rand_val,d3
  29.     move.l    #0,d0        ;clear ret val for not finished
  30.     subq    #1,d1
  31. loop
  32.     lsr.l    #1,d3        ;rand_val >>= 1;
  33.     bhi    ok        ;bif not 0 || no carry
  34. xor
  35.     eor.l    d4,d3        ;rand_val ^= rand_mask;
  36. ok
  37.     cmp.l    d5,d3        ;if( rand_val > maxbit )
  38.     bls    setbit        ;go set the bit if ok
  39.     bra    loop
  40. setloop
  41.     lsr.l    #1,d3        ;do the shift
  42.     bls    xor        ;bif need to do the exculsive or
  43. setbit
  44.     move.l    d3,d2        ;copy to temp reg
  45.     lsr.l    #3,d2        ;make it a byte offset
  46.     bset    d3,0(a0,d2.l)    ;set the bit in the array
  47.     dbne    d1,setloop    ;end if bit is already set || # of bits done
  48.     beq    ret
  49.     move.l    #1,d0        ;set ret val for finished
  50. ret
  51.     move.l    d3,_rand_val    ;save new random value
  52.     movem.l    (a7)+,d2-d5
  53.  
  54.     rts
  55.  
  56.     end
  57.